iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
生成式 AI

一起來打造 PTT 文章智慧問答系統!系列 第 8

【Day 08】設計 Django Model 並連接資料庫 - 定義資料結構與模型

  • 分享至 

  • xImage
  •  

Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com


今天我們將進一步學習如何在 Django 中設計資料模型(Model),這也是開發資料驅動應用的核心步驟。透過定義 Model,我們可以清楚描述資料的結構與關聯,並自動對應到資料庫中的資料表。

我們會搭配 MariaDB 作為後端資料庫,實際操作如何將資料模型儲存到資料庫中,並執行基本的資料操作(增、查、改、刪)。


今日目標

  • 創建 article app
  • 建立文章資料模型(Model)
  • 完成資料庫遷移
  • 撰寫測試資料寫入邏輯

創建名為 article 的 Django App

在專案根目錄下輸入以下指令建立新的 app:

python manage.py startapp article

然後就會自動幫你新增以下檔案:

https://ithelp.ithome.com.tw/upload/images/20250806/20172834u3I86YqOU5.png

接下來請將 article 加入 settings.pyINSTALLED_APPS 中:

INSTALLED_APPS = [
    ...
    'article',
]

建立 Article Model

編輯 article/models.py

from django.db import models

class Article(models.Model):
    board = models.CharField(max_length=100) # 看板名稱
    title = models.CharField(max_length=255) # 文章標題
    author = models.CharField(max_length=100) # 作者帳號
    content = models.TextField() # 文章內文
    post_time = models.DateTimeField() # po文時間
    url = models.URLField(max_length=255) # 文章連結

    def __str__(self):
        return f"[{self.board}] {self.title}"

執行資料庫遷移

在執行資料庫遷移前,請先把資料庫設定改為以下內容:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'my_database',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

使用 Django 的 ORM migration 流程:

python manage.py makemigrations article
python manage.py migrate

確認後 MariaDB 中會建立 article_articleappname_modelname 格式)這張資料表。

欄位名稱 資料型別 長度 說明
id BIGINT 20 主鍵,自動遞增
board VARCHAR 100 看板名稱
title VARCHAR 255 文章標題
author VARCHAR 100 作者帳號
content LONGTEXT X 文章內容
post_time TIMESTAMP 6 發文時間
url VARCHAR 255 文章連結

撰寫測試資料寫入程式

為了確認資料表與模型設定正確,我們來將測試資料寫入資料庫。

在檔案 scraper.py 最上方增加以下程式碼,手動設定 Django 環境:

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ptt_rag_dev.settings')
django.setup()

ptt_scrape 倒數第三行改為,這樣我們就能運用 url:

article_data.update({'board': board, 'url': article_url})  # 加入版面名稱資訊與網址

接著將 if __name__ == "__main__": 的部分改為:

if __name__ == "__main__":
    from article.models import Article
    from django.db.utils import IntegrityError
    article_datas = ptt_scrape("Gossiping")
    for article_data in article_datas:
        print(article_data)
        try:
            Article.objects.create(
                board=article_data['board'],
                title=article_data["title"],
                author=article_data["author"],
                url=article_data["url"],
                content=article_data["content"],
                post_time=article_data["post_time"]
            )
        except IntegrityError:
            print("寫入錯誤!")
    print('完成所有寫入!')

直接執行 scraper.py 後可以看到資料庫 article_article 確實寫入資料了!
https://ithelp.ithome.com.tw/upload/images/20250527/20172834qQOjPY14qL.png


明日預告 –【Day 09】使用 Celery + Redis 建立非同步排程爬蟲

下一篇我們將開始打造自動化爬蟲任務,讓系統可以定期抓取最新文章並寫入資料庫。不必手動點擊,一切交給背景執行!


上一篇
【Day 07】建立基本爬蟲抓取文章列表與內容 – 寫出完整爬蟲程式
下一篇
【Day 09】認識 Celery & Redis - 認識、安裝與設定 Celery 與 Redis
系列文
一起來打造 PTT 文章智慧問答系統!13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言